# -*- coding: utf-8 -*-
"""
******* 文档说明 ******
打印指定文件夹下所有文件名

C:\ProgramData\Anaconda3\envs\py36  Folder Size:【1.6 GB】

└-- C:\ProgramData\Anaconda3\envs\py36
    ├-- api-ms-win-core-console-l1-1-0.dll    【18.8 KB  C   M 2018-04-20 23:28:52】
    ├-- api-ms-win-core-datetime-l1-1-0.dll    【18.3 KB  C   M 2018-04-20 23:28:50】
    ├-- api-ms-win-core-debug-l1-1-0.dll    【18.3 KB  C   M 2018-04-20 23:28:56】
    ├-- api-ms-win-core-errorhandling-l1-1-0.dll    【18.3 KB  C   M 2018-04-20 23:28:58】


# 当前项目: Tools
# 创建时间: 2018/8/8 22:00 
# 开发作者: Vincent
# 创建平台: PyCharm Community Edition    python 3.5
# 版    本: V1.0
"""
import os
import time
import argparse


#  把文件大小 xx B 转换成对应的最佳显示方式
def _size_h(size):
    if size >= 1024 * 1024 * 1024:
        return "{:.1f} GB".format(size / (1024 * 1024 * 1024))
    elif size >= 1024 * 1024:
        return "{:.1f} MB".format(size / (1024 * 1024))
    elif size >= 1024:
        return "{:.1f} KB".format(size / 1024)
    else:
        return "{:.0f} B".format(size)


#  把时间戳转化为时间: 1479264792 to 2016-11-16 10:53:12
def time2str(timestamp):
    time_struct = time.localtime(timestamp)
    return time.strftime('%Y-%m-%d %H:%M:%S', time_struct)


# 打印指定路径下的 各文件信息
def print_file_list(path='.', ctime=True, mtime=True, txt_path=None):
    path = os.path.abspath(path)

    print('Search Path:  【{}】'.format(path))
    # 若没有指定保存文件名， 直接以搜索文件夹名称作为文件名
    if txt_path is None:
        txt_path = os.path.basename(path)

    f_txt_path = '{}_FileList-{}_{}-{}.txt'.format(txt_path, ctime, mtime,
                                                   time.strftime('%Y%m%d%H%M%S', time.localtime()))
    f_txt = open(f_txt_path, 'w', encoding='utf8')
    print(' ' * 100, file=f_txt)

    raw_layer = len(path.split(os.sep)) - 1

    # 文件夹大小
    folder_size = 0

    for root_i, dirs, files in os.walk(path, topdown=True):
        diff_layer = len(root_i.split(os.sep)) - raw_layer

        print(u'{}└-- {}'.format('    ' * (diff_layer - 1), root_i), file=f_txt)

        for ii, file_i in enumerate(files):
            f_path = os.path.join(root_i, file_i)

            # 文件大小
            try:
                f_size = os.path.getsize(f_path)
                folder_size += f_size
            except:
                f_size = -1

            if ctime:
                try:
                    # 创建日期
                    f_ctime = time2str(os.path.getctime(f_path))
                except:
                    f_ctime = 'Error'
            else:
                f_ctime = ''

            if mtime:
                try:
                    # 修改日期
                    f_mtime = time2str(os.path.getmtime(f_path))
                except:
                    f_mtime = 'Error'
            else:
                f_mtime = ''

            if ii < len(files) - 1:
                print(
                    u'{}├-- {}    【{}  C {}  M {}】'.format('    ' * diff_layer, file_i, _size_h(f_size), f_ctime, f_mtime),
                    file=f_txt)
            else:
                print(
                    u'{}└-- {}    【{}  C {}  M {}】'.format('    ' * diff_layer, file_i, _size_h(f_size), f_ctime, f_mtime),
                    file=f_txt)

    # 文件指针移动到文件头
    f_txt.seek(0)
    print('{}  Folder Size:【{}】'.format(path, _size_h(folder_size)), file=f_txt)

    print('Search Over!  Folder Size:【{}】  Result Save Path:  【{}】'.format(_size_h(folder_size),
                                                                           os.path.abspath(f_txt_path)))


if __name__ == '__main__':
    parser = argparse.ArgumentParser(
        description="""
        文件搜索脚本
        """)

    # 训练样本文件名称
    parser.add_argument('-f', '--folder', default='.', help='待搜索的文件夹路径, 默认为当前目录')
    parser.add_argument('-c', '--ctime', action='store_true', help='文件创建时间')
    parser.add_argument('-m', '--mtime', action='store_false', help='文件修改时间')

    args = parser.parse_args()

    print_file_list(args.folder, args.ctime, args.mtime)
